using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._TopographicProductionTools._Cartography._Banding
{
    /// <summary>
    /// <para>Generate Elevation Bands</para>
    /// <para>Creates an elevation bands feature class from a Digital Elevation Model (DEM).</para>
    /// <para>从数字高程模型 （DEM） 创建高程波段要素类。</para>
    /// </summary>    
    [DisplayName("Generate Elevation Bands")]
    public class GenerateElevationBands : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public GenerateElevationBands()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_raster">
        /// <para>Input Raster</para>
        /// <para>The rasters used to create elevation bands.</para>
        /// <para>用于创建高程带的栅格。</para>
        /// </param>
        /// <param name="_in_aoi">
        /// <para>Area of Interest</para>
        /// <para>The layer that defines the processing extent.</para>
        /// <para>定义处理范围的图层。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class containing the output elevation band features.</para>
        /// <para>包含输出高程带要素的要素类。</para>
        /// </param>
        /// <param name="_contour_interval">
        /// <para>Contour Interval</para>
        /// <para><xdoc>
        ///   <para>Determines the closest available contour when calculating the elevation band area. The default is 20.</para>
        ///   <bulletList>
        ///     <bullet_item>10—A contour interval of 10.</bullet_item><para/>
        ///     <bullet_item>20—A contour interval of 20.</bullet_item><para/>
        ///     <bullet_item>40—A contour interval of 40.</bullet_item><para/>
        ///     <bullet_item>80—A contour interval of 80.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>在计算高程带面积时确定最接近的可用等值线。默认值为 20。</para>
        ///   <bulletList>
        ///     <bullet_item>10 - 等值线间隔为 10。</bullet_item><para/>
        ///     <bullet_item>20 - 等值线间隔为 20。</bullet_item><para/>
        ///     <bullet_item>40 - 等值线间隔为 40。</bullet_item><para/>
        ///     <bullet_item>80 - 等值线间隔为 80。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// </param>
        /// <param name="_min_area">
        /// <para>Minimum Feature Area</para>
        /// <para><xdoc>
        ///   <para>The minimum area for output polygons. Features smaller than this value will be removed. The default is 0.00016 square decimal degrees.
        ///   <para>If you're creating an output dataset with a projected coordinate system, this value should reflect the square units of that coordinate system—for example, square meters for a UTM dataset. Otherwise, the default value may result in an empty output dataset.</para>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>输出面的最小面积。小于此值的要素将被移除。默认值为 0.00016 平方十进制度。
        ///   <para>如果要创建具有投影坐标系的输出数据集，则此值应反映该坐标系的平方单位，例如，UTM 数据集的平方米。否则，默认值可能会导致输出数据集为空。</para>
        ///   </para>
        /// </xdoc></para>
        /// </param>
        /// <param name="_smooth_tolerance">
        /// <para>Smoothing Tolerance</para>
        /// <para>The tolerance used by the smoothing algorithm. The larger the value, the more generalized the output band features. The default is 0.002 decimal degrees.</para>
        /// <para>平滑算法使用的容差。该值越大，输出频带特征越通用。默认值为 0.002 十进制度。</para>
        /// </param>
        public GenerateElevationBands(List<object> _in_raster, object _in_aoi, object _out_feature_class, long _contour_interval, double _min_area, string _smooth_tolerance)
        {
            this._in_raster = _in_raster;
            this._in_aoi = _in_aoi;
            this._out_feature_class = _out_feature_class;
            this._contour_interval = _contour_interval;
            this._min_area = _min_area;
            this._smooth_tolerance = _smooth_tolerance;
        }
        public override string ToolboxName => "Topographic Production Tools";

        public override string ToolName => "Generate Elevation Bands";

        public override string CallName => "topographic.GenerateElevationBands";

        public override List<string> AcceptEnvironments => [];

        public override object[] ParameterInfo => [_in_raster, _in_aoi, _out_feature_class, _contour_interval, _min_area, _smooth_tolerance, _in_hydro_features, _number_of_bands];

        /// <summary>
        /// <para>Input Raster</para>
        /// <para>The rasters used to create elevation bands.</para>
        /// <para>用于创建高程带的栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public List<object> _in_raster { get; set; }


        /// <summary>
        /// <para>Area of Interest</para>
        /// <para>The layer that defines the processing extent.</para>
        /// <para>定义处理范围的图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Area of Interest")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_aoi { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class containing the output elevation band features.</para>
        /// <para>包含输出高程带要素的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>Contour Interval</para>
        /// <para><xdoc>
        ///   <para>Determines the closest available contour when calculating the elevation band area. The default is 20.</para>
        ///   <bulletList>
        ///     <bullet_item>10—A contour interval of 10.</bullet_item><para/>
        ///     <bullet_item>20—A contour interval of 20.</bullet_item><para/>
        ///     <bullet_item>40—A contour interval of 40.</bullet_item><para/>
        ///     <bullet_item>80—A contour interval of 80.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>在计算高程带面积时确定最接近的可用等值线。默认值为 20。</para>
        ///   <bulletList>
        ///     <bullet_item>10 - 等值线间隔为 10。</bullet_item><para/>
        ///     <bullet_item>20 - 等值线间隔为 20。</bullet_item><para/>
        ///     <bullet_item>40 - 等值线间隔为 40。</bullet_item><para/>
        ///     <bullet_item>80 - 等值线间隔为 80。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Contour Interval")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public long _contour_interval { get; set; }


        /// <summary>
        /// <para>Minimum Feature Area</para>
        /// <para><xdoc>
        ///   <para>The minimum area for output polygons. Features smaller than this value will be removed. The default is 0.00016 square decimal degrees.
        ///   <para>If you're creating an output dataset with a projected coordinate system, this value should reflect the square units of that coordinate system—for example, square meters for a UTM dataset. Otherwise, the default value may result in an empty output dataset.</para>
        ///   </para>
        /// </xdoc></para>
        /// <para><xdoc>
        /// <para>输出面的最小面积。小于此值的要素将被移除。默认值为 0.00016 平方十进制度。
        ///   <para>如果要创建具有投影坐标系的输出数据集，则此值应反映该坐标系的平方单位，例如，UTM 数据集的平方米。否则，默认值可能会导致输出数据集为空。</para>
        ///   </para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum Feature Area")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public double _min_area { get; set; }


        /// <summary>
        /// <para>Smoothing Tolerance</para>
        /// <para>The tolerance used by the smoothing algorithm. The larger the value, the more generalized the output band features. The default is 0.002 decimal degrees.</para>
        /// <para>平滑算法使用的容差。该值越大，输出频带特征越通用。默认值为 0.002 十进制度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Smoothing Tolerance")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string _smooth_tolerance { get; set; }


        /// <summary>
        /// <para>Hydro Exclusion Features</para>
        /// <para>The bodies of water to exclude when calculating the elevation band area.</para>
        /// <para>计算高程带面积时要排除的水体。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Hydro Exclusion Features")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _in_hydro_features { get; set; } = null;


        /// <summary>
        /// <para>Number of Elevation Bands</para>
        /// <para><xdoc>
        ///   <para>The number of elevation bands generated by the tool.</para>
        ///   <bulletList>
        ///     <bullet_item>1—One elevation band will be generated.</bullet_item><para/>
        ///     <bullet_item>2—Two elevation bands will be generated.</bullet_item><para/>
        ///     <bullet_item>3—Three elevation bands will be generated.</bullet_item><para/>
        ///     <bullet_item>4—Four elevation bands will be generated.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>工具生成的高程带数。</para>
        ///   <bulletList>
        ///     <bullet_item>1 - 将生成一个高程带。</bullet_item><para/>
        ///     <bullet_item>2 - 将生成两个高程带。</bullet_item><para/>
        ///     <bullet_item>3 - 将生成三个高程带。</bullet_item><para/>
        ///     <bullet_item>4 - 将生成四个高程带。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Number of Elevation Bands")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public long? _number_of_bands { get; set; } = null;


        public GenerateElevationBands SetEnv()
        {
            base.SetEnv();
            return this;
        }

    }

}